﻿//   EEL (Program.cs)
//
//   Copyright 2009 Eric Llewellyn
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LibEELbeta;
using System.IO;

namespace EEL
{
    class Program
    {
        static void Main(string[] args)
        {
            Interpreter interpreter = new Interpreter();
            interpreter.SyntaxError += new SyntaxErrorDelegate(interpreter_SyntaxError);
            interpreter.RuntimeError += new RuntimeErrorDelegate(interpreter_RuntimeError);
            interpreter.ReadFunction = delegate(object FunctionOnRead)
                { interpreter.Call(FunctionOnRead, System.Console.ReadLine()); };
            interpreter.WriteFunction = delegate(string s) { System.Console.WriteLine(s); };

            if (args.Length < 1)
            {
                string line;
                System.Console.WriteLine(VirtualMachine.Version);
                System.Console.Write(">");
                do
                {
                    line = System.Console.ReadLine();
                    interpreter.RunText(line);

                    if (interpreter.WaitingForInput)
                        System.Console.Write(">>");
                    else
                        System.Console.Write(">");
                } while (true);
            }
            else
            {
                BinaryReader br = new BinaryReader(new FileStream(args[0], FileMode.Open));
                byte[] bytes = br.ReadBytes((int)br.BaseStream.Length);
                br.Close();
                if (interpreter.RunBinary(bytes) == false)
                {
                    StreamReader sr = new StreamReader(args[0]);
                    string line = sr.ReadToEnd();
                    sr.Close();
                    interpreter.RunText(line);
                }
            }
        }

        static void interpreter_RuntimeError(string message, int instructionNumber)
        {
            System.Console.WriteLine("stdin" + ":" + message);
        }

        static void interpreter_SyntaxError(string msg, Token t)
        {
            System.Console.WriteLine("stdin" + ":" + t.line + ": " + msg + " near " + t.value);
        }
    }
}
